package com.shujia.hbase.api;

import java.util.ArrayList;

public class Demo5Iop {
    public static void main(String[] args) {

        /**
         * 面向接口编程
         *
         * 将具体的操作定义成接口   给用户暴露一个编程的入口
         *
         *
         */

        ArrayList<Integer> data = new ArrayList<>();
        data.add(1);
        data.add(2);
        data.add(4);
        data.add(6);
        data.add(2);
        data.add(5);

        DataSet dataSet = new DataSet(data);

        Integer max = dataSet.max();
        System.out.println(max);
        System.out.println(dataSet.min());


        //获取dataset里面所有的奇数

        System.out.println(dataSet.js());
        System.out.println(dataSet.os());


        //匿名内部类
        Function function = new Function() {
            @Override
            public boolean filter(Integer integer) {
                //实现自定义过滤规则

                return integer > 5;
            }
        };

        ArrayList<Integer> filter = dataSet.filter(function);
        System.out.println(filter);

        //简写
        dataSet.filter(new Function() {

            @Override
            public boolean filter(Integer integer) {
                return integer % 2 == 1;
            }
        });

        dataSet.filter(integer -> integer % 2 == 1);


        /**
         * 将dataset中的元素全部乘以2
         * 将dataset中的元素全部加2
         *
         * 对dataset中的每个元素做相同的操作
         *
         */

        ArrayList<Integer> map = dataSet.map(new MapFunction() {
            @Override
            public Integer map(Integer integer) {

                return integer * 2;
            }
        });

        System.out.println(map);


    }
}


class DataSet {
    private ArrayList<Integer> data;

    public DataSet(ArrayList<Integer> data) {
        this.data = data;
    }


    public Integer max() {
        Integer max = 0;
        for (Integer datum : data) {
            if (datum > max) {
                max = datum;
            }
        }
        return max;
    }

    public Integer min() {
        Integer min = Integer.MAX_VALUE;
        for (Integer datum : data) {
            if (datum < min) {
                min = datum;
            }
        }
        return min;
    }

    public ArrayList<Integer> js() {
        ArrayList<Integer> integers = new ArrayList<>();

        for (Integer datum : data) {

            if (datum % 2 == 1) {
                integers.add(datum);
            }
        }

        return integers;
    }

    public ArrayList<Integer> os() {
        ArrayList<Integer> integers = new ArrayList<>();

        for (Integer datum : data) {

            if (datum % 2 == 0) {
                integers.add(datum);
            }
        }

        return integers;
    }


    /**
     * 过滤数据   需要过滤规则
     */
    public ArrayList<Integer> filter(Function function) {

        ArrayList<Integer> integers = new ArrayList<>();

        for (Integer datum : data) {

            //将比较规则抽象成一个接口
            if (function.filter(datum)) {
                integers.add(datum);
            }
        }

        return integers;
    }


    /**
     * 对数据进行处理的方法
     * <p>
     * 将dataset中的元素全部乘以2
     */
    public ArrayList<Integer> map(MapFunction function) {

        ArrayList<Integer> integers = new ArrayList<>();
        for (Integer datum : data) {
            //将操作方式抽象成接口
            integers.add(function.map(datum));
        }

        return integers;

    }


}


interface Function {

    boolean filter(Integer integer);

}

interface MapFunction {
    Integer map(Integer integer);
}

